package io01;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通过提高每次读写的数据量减少实际读写的次数，可以提高读写的效率
 * 用一组字节数组byte进行块读写
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("JAVA.jpg");
        FileOutputStream fos = new FileOutputStream("JAVA_cp1.jpg");
        /*
        InputStream超类中定义了块读取数据的方法：
        int read(byte[] data)
        一次性读取给定的字节数组data总长度的字节量，并存入到字节数组中，返回值表示实际读取到了多少个字节，若返回-1表示读到了末尾

        OutputStream超类中定义了块写字节的方法：
        void write(byte[] data)
        一次性将给定的字节数组data中所有的字节写出
        void write(byte[] data,int offset,int len)
        一次性将给定的字节数组data从下标offset处开始的连续len个字节输出，用于解决复制后内存变大的问题
         */
        long start = System.currentTimeMillis();
        byte[] data = new byte[1024*10]; //10kb---1kb=1024b
        int len; //记录每次实际读取的字节数
        while((len=fis.read(data))!=-1){ //每次读取10kb并判断是否读取到了末尾
            fos.write(data,0,len); //将字节数组byte从下标0开始连续len个字节写出(做到读多少就写多少)
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕！耗时"+(end-start)+"ms");
        fis.close();
        fos.close();

        /*
        用这种方法读写，复制后的数据会变大
        FileInputStream fis = new FileInputStream("常量池.jpg");
        FileOutputStream fos = new FileOutputStream("常量池_cp2.jpg");
        long start = System.currentTimeMillis();
        byte[] data = new byte[1024*10]; //10kb---1kb=1024b
        while(fis.read(data)!=-1){ //每次读取10kb并判断是否读取到了末尾
            fos.write(data); //一次写入10kb数据
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕！耗时"+(end-start)+"ms");
        fis.close();
        fos.close();
         */
    }
}
